package br.ufpe.cin.ip.biblioteca.repositorios;

import br.ufpe.cin.ip.biblioteca.entidades.Usuario;
import br.ufpe.cin.ip.biblioteca.excecoes.RepositorioException;
import br.ufpe.cin.ip.biblioteca.excecoes.UsuarioJaCadastradoException;
import br.ufpe.cin.ip.biblioteca.excecoes.UsuarioNaoEncontradoException;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorUsuario;
import br.ufpe.cin.ip.biblioteca.iterator.IteratorUsuarioLista;
import br.ufpe.cin.ip.biblioteca.tad.ListaUsuario;

public class RepositorioUsuarioLista implements RepositorioUsuario {
	private ListaUsuario usuarios;
	
	@Override
	public void adicionar(Usuario usuario) throws RepositorioException, UsuarioJaCadastradoException {
		if(this.usuarios!=null) {
			if(this.existe(usuario)) {
				throw new UsuarioJaCadastradoException();
			} else {
				this.usuarios.inserir(usuario);
			}
		} else {
			this.usuarios = new ListaUsuario(usuario);
		}
	}
	
	@Override
	public void remover(Usuario usuario) throws RepositorioException, UsuarioNaoEncontradoException {
		if(this.existe(usuario)) {
			this.usuarios.remover(usuario);
		} else {
			throw new UsuarioNaoEncontradoException();
		}
	}
	
	@Override
	public void atualizar(Usuario usuario) throws RepositorioException, UsuarioNaoEncontradoException {
		if(this.usuarios!=null) {
			Usuario retorno = null;
			IteratorUsuario it = this.usuarios.getIterator();
			
			while(it.hasNext()) {
				Usuario u = it.next();
				
				if(usuario.equals(u))
					retorno = u;
			}
			
			if(retorno==null) {
				throw new UsuarioNaoEncontradoException();
			} else {
				retorno.setNome(usuario.getNome());
				retorno.setMatricula(usuario.getMatricula());
				retorno.setRG(usuario.getRG());
			}
		} else {
			throw new UsuarioNaoEncontradoException();
		}
	}
	
	@Override
	public Usuario buscar(Usuario usuario) throws RepositorioException, UsuarioNaoEncontradoException {
		if(this.usuarios!=null) {
			Usuario retorno = null;
			IteratorUsuario it = this.usuarios.getIterator();
			
			while(it.hasNext()) {
				Usuario u = it.next();
				
				if(usuario.equals(u))
					retorno = u;
			}
			
			if(retorno==null) {
				throw new UsuarioNaoEncontradoException();
			} else {
				return retorno;
			}
		} else {
			throw new UsuarioNaoEncontradoException();
		}
	}
	
	public IteratorUsuario getIterator() {
		return new IteratorUsuarioLista(this.usuarios);
	}
	
	@Override
	public boolean existe(Usuario usuario) throws RepositorioException {
		boolean retorno = false;
		
		if(this.usuarios!=null) {
			IteratorUsuario it = this.usuarios.getIterator();
			
			while(it.hasNext()) {
				Usuario u = it.next();
				
				if(usuario.equals(u))
					retorno = true;
			}
		}
		
		return retorno;
	}
}
